Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Feature-oriented programming</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Feature-oriented_programming"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Feature-oriented_programming rootpage-Feature-oriented_programming skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Feature-oriented programming</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><style data-mw-deduplicate="TemplateStyles:r1251242444">
/* start https://en.wikipedia.org/ */


.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style>
<p>In <a href="Computer_programming" title="Computer programming">computer programming</a>, <b>feature-oriented programming</b> (<b>FOP</b>) or <b>feature-oriented software development</b> (<b>FOSD</b>) is a <a href="Programming_paradigm" title="Programming paradigm">programming paradigm</a> for program generation in <a href="Software_product_lines" class="mw-redirect" title="Software product lines">software product lines</a> (SPLs) and for incremental development of programs.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="History">History</h2></div>

<p>FOSD arose out of layer-based designs and levels of abstraction in network protocols and extensible database systems in the late-1980s.<sup id="cite_ref-genvoca_1-0" class="reference"><a href="#cite_note-genvoca-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> A program was a stack of layers. Each layer added functionality to previously composed layers and different compositions of layers produced different programs. Not surprisingly, there was a need for a compact language to express such designs. Elementary algebra fit the bill: each layer was a function (a <a href="Program_transformation" title="Program transformation">program transformation</a>) that added new code to an existing program to produce a new program, and a program's design was modeled by an expression, i.e., a composition of transformations (layers). The figure to the left illustrates the stacking of layers i, j, and h (where h is on the bottom and i is on the top). The algebraic notations i(j(h)), i•j•h, and i+j+h have been used to express these designs.
</p><p>Over time, layers were equated to features, where a <i>feature</i> is an increment in program functionality. The paradigm for program design and generation was recognized to be an outgrowth of relational query optimization, where query evaluation programs were defined as relational algebra expressions, and <a href="Query_optimization" title="Query optimization">query optimization</a> was expression optimization.<sup id="cite_ref-selinger_2-0" class="reference"><a href="#cite_note-selinger-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> A software product line is a family of programs where each program is defined by a unique composition of features. FOSD has since evolved into the study of feature modularity, tools, analyses, and design techniques to support feature-based program generation.
</p><p>The second generation of FOSD research was on feature interactions, which originated in telecommunications. Later, the term <i>feature-oriented programming</i> was coined;<sup id="cite_ref-FOP_3-0" class="reference"><a href="#cite_note-FOP-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> this work exposed interactions between layers. Interactions require features to be adapted when composed with other features.
</p><p>A third generation of research focussed on the fact that every program has multiple representations (e.g., source, makefiles, documentation, etc.) and adding a feature to a program should elaborate each of its representations so that all are consistent. Additionally, some of representations could be generated (or derived) from others. In the sections below, the mathematics of the three most recent generations of FOSD, namely <a href="#GenVoca">GenVoca</a>,<sup id="cite_ref-genvoca_1-1" class="reference"><a href="#cite_note-genvoca-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> <a href="#AHEAD">AHEAD</a>,<sup id="cite_ref-ahead_4-0" class="reference"><a href="#cite_note-ahead-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> and <a href="#FOMDD">FOMDD</a><sup id="cite_ref-fomdd_5-0" class="reference"><a href="#cite_note-fomdd-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-genmeta_6-0" class="reference"><a href="#cite_note-genmeta-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> are described, and links to product lines that have been developed using FOSD tools are provided. Also, four additional results that apply to all generations of FOSD are: <a href="FOSD_metamodels" title="FOSD metamodels">FOSD metamodels</a>, <a href="FOSD_program_cubes" title="FOSD program cubes">FOSD program cubes</a>, and FOSD feature interactions.
</p>
<div class="mw-heading mw-heading2"><h2 id="GenVoca">GenVoca</h2></div>
<p><b>GenVoca</b> (a <a href="Portmanteau" class="mw-redirect" title="Portmanteau">portmanteau</a> of the names Genesis and Avoca)<sup id="cite_ref-genvoca_1-2" class="reference"><a href="#cite_note-genvoca-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> is a compositional paradigm for defining programs of product lines. Base programs are 0-ary functions or transformations called <b>values</b>:
</p>
<pre> f -- base program with feature f
h -- base program with feature h
</pre>
<p>and features are unary functions/transformations that elaborate (modify, extend, refine) a program:
</p>
<pre> i + x -- adds feature i to program x
j + x -- adds feature j to program x
</pre>
<p>where + denotes function composition. The <i>design</i> of a program is a named expression, e.g.:
</p>
<pre> p<sub>1</sub> = j + f -- program p<sub>1</sub> has features j and f
p<sub>2</sub> = j + h -- program p<sub>2</sub> has features j and h
p<sub>3</sub> = i + j + h -- program p<sub>3</sub> has features i, j, and h
</pre>
<p>A <b>GenVoca model</b> of a domain or software product line is a collection of base programs and features (see <a href="FOSD_metamodels" title="FOSD metamodels">MetaModels</a> and <a href="FOSD_program_cubes" title="FOSD program cubes">Program Cubes</a>).
The programs (expressions) that can be created defines a product line. Expression optimization is <i>program design optimization</i>, and expression evaluation is <i>program generation</i>.
</p>
<dl><dd>Note: GenVoca is based on the stepwise development of programs: a process that emphasizes design simplicity and understandability, which are key to program comprehension and automated program construction. Consider program p<sub>3</sub> above: it begins with base program h, then feature j is added (read: the functionality of feature j is added to the codebase of h), and finally feature i is added (read: the functionality of feature i is added to the codebase of j•h).</dd></dl>
<dl><dd>Note: not all combinations of features are meaningful. <a href="Feature_Model" class="mw-redirect" title="Feature Model">Feature models</a> (which can be translated into propositional formulas) are graphical representations that define legal combinations of features.<sup id="cite_ref-splc_7-0" class="reference"><a href="#cite_note-splc-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup></dd></dl>
<dl><dd>Note: A more recent formulation of GenVoca is <b>symmetric</b>: there is only one base program, 0 (the empty program), and all features are unary functions. This suggests the interpretation that GenVoca composes program structures by <b>superposition</b>, the idea that complex structures are composed by superimposing simpler structures.<sup id="cite_ref-amast08_8-0" class="reference"><a href="#cite_note-amast08-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-symmetric_9-0" class="reference"><a href="#cite_note-symmetric-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> Yet another reformulation of GenVoca is as a <a href="Monoid" title="Monoid">monoid</a>: a GenVoca model is a set of features with a composition operation (•); composition is associative and there is an identity element (namely 1, the identity function). Although all compositions are possible, not all are meaningful. That's the reason for <a href="Feature_Model" class="mw-redirect" title="Feature Model">feature models</a>.</dd></dl>
<p>GenVoca features were originally implemented using C preprocessor (<code>#ifdef feature ... #endif</code>) techniques. A more advanced technique, called <a href="FOSD_Mixin_Layers" title="FOSD Mixin Layers">mixin layers</a>, showed the connection of features to object-oriented collaboration-based designs.
</p>
<div class="mw-heading mw-heading2"><h2 id="AHEAD">AHEAD</h2></div>
<p><b>Algebraic Hierarchical Equations for Application Design</b> (<b>AHEAD</b>)<sup id="cite_ref-ahead_4-1" class="reference"><a href="#cite_note-ahead-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> generalized GenVoca in two ways. First, it revealed the internal structure of GenVoca values as tuples. Every program has multiple representations, such as source, documentation, bytecode, and makefiles. A GenVoca value is a tuple of program representations. In a product line of parsers, for example, a base parser f is defined by its grammar g<sub>f</sub>, Java source s<sub>f</sub>, and documentation d<sub>f</sub>. Parser f is modeled by the tuple f=[g<sub>f</sub>, s<sub>f</sub>, d<sub>f</sub>]. Each program representation may have subrepresentations, and they too may have subrepresentations, recursively. In general, a GenVoca value is a tuple of nested tuples that define a hierarchy of representations for a particular program.
</p>
<dl><dd><dl><dd></dd></dl></dd></dl>
<p>Example. Suppose terminal representations are files. In AHEAD, grammar g<sub>f</sub> corresponds to a single BNF file, source s<sub>f</sub> corresponds to a tuple of Java files [c<sub>1</sub>…c<sub>n</sub>], and documentation d<sub>f</sub> is a tuple of HTML files [h<sub>1</sub>…h<sub>k</sub>]. A GenVoca value (nested tuples) can be depicted as a directed graph: the graph for parser f is shown in the figure to the right. Arrows denote projections, i.e., mappings from a tuple to one of its components. AHEAD implements tuples as file directories, so f is a directory containing file g<sub>f</sub> and subdirectories s<sub>f</sub> and d<sub>f</sub>. Similarly, directory s<sub>f</sub> contains files c<sub>1</sub>…c<sub>n</sub>, and directory df contains files h<sub>1</sub>…h<sub>k</sub>.
</p>
<dl><dd><dl><dd>Note: Files can be hierarchically decomposed further. Each Java class can be decomposed into a tuple of members and other class declarations (e.g., initialization blocks, etc.). The important idea here is that the mathematics of AHEAD are recursive.</dd></dl></dd></dl>
<p>Second, AHEAD expresses features as nested tuples of unary functions called <b>deltas</b>. Deltas can be <b>program refinements</b> (semantics-preserving transformations), <b>extensions</b> (semantics-extending transformations),
or <b>interactions</b> (semantics-altering transformations). We use the neutral term “delta” to represent all of these possibilities, as each occurs in FOSD.
</p><p>To illustrate, suppose feature j extends a grammar by Δg<sub>j</sub> (new rules and tokens are added), extends source code by Δs<sub>j</sub> (new classes and members are added and existing methods are modified), and extends documentation by Δd<sub>j</sub>. The tuple of deltas for feature j is modeled by j=[Δg<sub>j</sub>,Δs<sub>j</sub>,Δd<sub>j</sub>], which we call a <b>delta tuple</b>. Elements of delta tuples can themselves be delta tuples. Example: Δs<sub>j</sub> represents the changes that are made to each class in s<sub>f</sub> by feature j, i.e., Δs<sub>j</sub>=[Δc<sub>1</sub>…Δc<sub>n</sub>].
The representations of a program are computed recursively by nested vector addition. The representations for parser p<sub>2</sub> (whose GenVoca expression is j+f) are:
</p>
<pre> p<sub>2</sub> = j + f -- GenVoca expression
= [Δg<sub>j</sub>, Δs<sub>j</sub>, Δd<sub>j</sub>] + [g<sub>f</sub>, s<sub>f</sub>, d<sub>f</sub>] -- substitution
= [Δg<sub>j</sub>+g<sub>f</sub>, Δs<sub>j</sub>+s<sub>f</sub>, Δd<sub>j</sub>+d<sub>f</sub>] -- compose tuples element-wise
</pre>
<p>That is, the grammar of p<sub>2</sub> is the base grammar composed with its extension (Δg<sub>j</sub>+g<sub>f</sub>), the source of p<sub>2</sub> is the base source composed with its extension (Δs<sub>j</sub>+s<sub>f</sub>), and so on. As elements of delta tuples can themselves be delta tuples, composition recurses, e.g., Δs<sub>j</sub>+s<sub>f</sub>=
[Δc<sub>1</sub>…Δc<sub>n</sub>]+[c<sub>1</sub>…c<sub>n</sub>]=[Δc<sub>1</sub>+c<sub>1</sub>…Δc<sub>n</sub>+c<sub>n</sub>].
Summarizing, GenVoca values are nested tuples of program artifacts, and features are nested delta tuples, where + recursively composes them by vector addition. This is the essence of AHEAD.
</p><p>The ideas presented above concretely expose two FOSD principles. The <b>Principle of Uniformity</b> states that all program artifacts are treated and modified in the same way. (This is evidenced by deltas for different artifact types above). The <b>Principle of Scalability</b> states all levels of abstractions are treated uniformly. (This gives rise to the hierarchical nesting of tuples above).
</p><p>The original implementation of AHEAD is the AHEAD Tool Suite and Jak language, which exhibits both the Principles of Uniformity and Scalability. Next-generation tools include CIDE
<sup id="cite_ref-CIDE_10-0" class="reference"><a href="#cite_note-CIDE-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>
and FeatureHouse.<sup id="cite_ref-FH_11-0" class="reference"><a href="#cite_note-FH-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="FOMDD">FOMDD</h2></div>

<p><b>Feature-Oriented Model-Driven Design</b> (<b>FOMDD</b>)<sup id="cite_ref-fomdd_5-1" class="reference"><a href="#cite_note-fomdd-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-genmeta_6-1" class="reference"><a href="#cite_note-genmeta-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> combines the ideas of AHEAD with <b>Model-Driven Design</b> (<b>MDD</b>) (a.k.a. <b><a href="Model-Driven_Architecture" class="mw-redirect" title="Model-Driven Architecture">Model-Driven Architecture</a></b> (<b>MDA</b>)). AHEAD functions capture the lockstep update of program artifacts when a feature is added to a program. But there are other functional relationships among program artifacts that express derivations. For example, the relationship between a grammar g<sub>f</sub> and its parser source s<sub>f</sub> is defined by a compiler-compiler tool, e.g., javacc. Similarly, the relationship between Java source s<sub>f</sub> and its bytecode b<sub>f</sub> is defined by the javac compiler. A <a href="Commuting_diagram" class="mw-redirect" title="Commuting diagram">commuting diagram</a> expresses these relationships. Objects are program representations, downward arrows are derivations, and horizontal arrows are deltas. The figure to the right shows the commuting diagram for program p<sub>3</sub> = i+j+h = [g<sub>3</sub>,s<sub>3</sub>,b<sub>3</sub>].
</p><p>A fundamental property of a <a href="Commutative_diagram" title="Commutative diagram">commuting diagram</a> is that all paths between two objects are equivalent. For example, one way to derive the bytecode b<sub>3</sub> of parser p<sub>3</sub> (lower right object in the figure to the right) from grammar g<sub>h</sub> of parser h (upper left object) is to derive the bytecode b<sub>h</sub> and refine to b<sub>3</sub>, while another way refines g<sub>h</sub> to g<sub>3</sub>, and then derive b<sub>3</sub>, where + represents delta composition and () is function or tool application:
</p>
<dl><dd>b<sub>3</sub> = Δb<sub>j</sub> + Δb<sub>i</sub> + <style data-mw-deduplicate="TemplateStyles:r886049734">
/* start https://en.wikipedia.org/ */


.mw-parser-output .monospaced{font-family:monospace,monospace}


/* end https://en.wikipedia.org/ */
</style><span class="monospaced"><a href="Javacc" class="mw-redirect" title="Javacc">javacc</a></span>( <span class="monospaced"><a href="Javac" title="Javac">javac</a></span>( g<sub>h</sub> ) ) = <span class="monospaced">javac</span>( <span class="monospaced">javacc</span>( Δg<sub>i</sub> + Δg<sub>j</sub> + g<sub>h</sub> ) )</dd></dl>
<p>There are <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\tbinom {4}{2}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="false" scriptlevel="0">
<mrow>
<mrow class="MJX-TeXAtom-OPEN">
<mo maxsize="1.2em" minsize="1.2em">(</mo>
</mrow>
<mfrac linethickness="0">
<mn>4</mn>
<mn>2</mn>
</mfrac>
<mrow class="MJX-TeXAtom-CLOSE">
<mo maxsize="1.2em" minsize="1.2em">)</mo>
</mrow>
</mrow>
</mstyle>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\tbinom {4}{2}}}</annotation>
</semantics>
</math></span><img src="./c9ff18e8619b44eee173312e57fd9a5854109be4.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -1.005ex; width:2.952ex; height:3.343ex;" alt="{\displaystyle {\tbinom {4}{2}}}" loading="lazy"></span> possible paths to derive the bytecode b<sub>3</sub> of parser p<sub>3</sub> from the grammar g<sub>h</sub> of parser h. Each path represents a <a href="Metaprogramming" title="Metaprogramming">metaprogram</a> whose execution generates the target object (b<sub>3</sub>) from the starting object (g<sub>f</sub>).
There is a potential optimization: traversing each arrow of a <a href="Commuting_diagram" class="mw-redirect" title="Commuting diagram">commuting diagram</a> has a cost. The cheapest (i.e., shortest) path between two objects in a <a href="Commuting_diagram" class="mw-redirect" title="Commuting diagram">commuting diagram</a> is a <b>geodesic</b>, which represents the most efficient metaprogram that produces the target object from a given object.
</p>
<dl><dd>Note: A “cost metric” need not be a monetary value; cost may be measured in production time, peak or total memory requirements, power consumption, or some informal metric like “ease of explanation”, or a combination of the above (e.g., <a href="Multiobjective_optimization" class="mw-redirect" title="Multiobjective optimization">multi-objective optimization</a>). The idea of a geodesic is general, and should be understood and appreciated from this more general context.</dd></dl>
<dl><dd>Note: It is possible for there to be m starting objects and n ending objects in a geodesic; when m=1 and n&gt;1, this is the <a href="Steiner_tree_problem" title="Steiner tree problem">Directed Steiner Tree Problem</a>, which is NP-hard.</dd></dl>
<p><a href="Commuting_diagram" class="mw-redirect" title="Commuting diagram">Commuting diagrams</a> are important for at least two reasons: (1) there is the possibility of optimizing the generation of artifacts (e.g., geodesics) and (2) they specify different ways of constructing a target object from a starting object.<sup id="cite_ref-fomdd_5-2" class="reference"><a href="#cite_note-fomdd-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-testing_12-0" class="reference"><a href="#cite_note-testing-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup> A path through a diagram corresponds to a tool chain: for an FOMDD model to be consistent, it should be proven (or demonstrated through testing) that all tool chains that map one object to another in fact yield equivalent results. If this is not the case, then either there is a bug in one or more of the tools or the FOMDD model is wrong.
</p>
<dl><dd>Note: the above ideas were inspired by <a href="Category_theory" title="Category theory">category theory</a>.<sup id="cite_ref-fomdd_5-3" class="reference"><a href="#cite_note-fomdd-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-genmeta_6-2" class="reference"><a href="#cite_note-genmeta-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup></dd></dl>
<div class="mw-heading mw-heading2"><h2 id="Applications">Applications</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706123320/ftp://ftp.cs.utexas.edu/pub/predator/tosem-92.pdf">Network Protocols</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706123320/ftp://ftp.cs.utexas.edu/pub/predator/tosem-92.pdf">Extensible Database Systems</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706123114/ftp://ftp.cs.utexas.edu/pub/predator/sigsoft-93.pdf">Data Structures</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706014110/ftp://ftp.cs.utexas.edu/pub/predator/fsatsRevised.pdf">Distributed Army Fire Support Simulator</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706123117/ftp://ftp.cs.utexas.edu/pub/predator/sigsoft-94.pdf">Production System Compiler</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122254/ftp://ftp.cs.utexas.edu/pub/predator/GPL.pdf">Graph Product Line</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706014058/ftp://ftp.cs.utexas.edu/pub/predator/ahead.pdf">Extensible Java Preprocessors</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122327/ftp://ftp.cs.utexas.edu/pub/predator/ICSE07.pdf">Web Portlets</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122855/ftp://ftp.cs.utexas.edu/pub/predator/icmt08.pdf">SVG Applications</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="FOSD_metamodels" title="FOSD metamodels">FOSD metamodels</a> – product lines of product lines</li>
<li><a href="FOSD_origami" title="FOSD origami">FOSD origami</a></li>
<li><a href="FOSD_program_cubes" title="FOSD program cubes">FOSD program cubes</a> – multi-dimensional product lines</li>
<li><a href="Very_high-level_programming_language" title="Very high-level programming language">Very high-level programming language</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-genvoca-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-genvoca_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-genvoca_1-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-genvoca_1-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706123320/ftp://ftp.cs.utexas.edu/pub/predator/tosem-92.pdf">"Design and Implementation of Hierarchical Software Systems with Reusable Components"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/tosem-92.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
<li id="cite_note-selinger-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-selinger_2-0">^</a></b></span> <span class="reference-text"><cite class="citation book cs1"><a rel="nofollow" class="external text" href="http://portal.acm.org/citation.cfm?id=582099"><i>Access Path Selection In Relational Databases</i></a>. 30 May 1979. pp.&nbsp;<span class="nowrap">23–</span>34. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F582095.582099">10.1145/582095.582099</a>. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>9780897910019</bdi>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&nbsp;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:8537523">8537523</a>.</cite></span>
</li>
<li id="cite_note-FOP-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOP_3-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20030803215756/http://www4.informatik.tu-muenchen.de/papers/ecoop_prehofer_1997_Publication.html">"Feature-Oriented Programming: A Fresh Look at Objects"</a>. Archived from <a rel="nofollow" class="external text" href="https://www4.informatik.tu-muenchen.de/papers/ecoop_prehofer_1997_Publication.html">the original</a> on 2003-08-03<span class="reference-accessdate">. Retrieved <span class="nowrap">2015-12-16</span></span>.</cite></span>
</li>
<li id="cite_note-ahead-4"><span class="mw-cite-backlink">^ <a href="#cite_ref-ahead_4-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-ahead_4-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122700/ftp://ftp.cs.utexas.edu/pub/predator/TSE-AHEAD.pdf">"Scaling Step-Wise Refinement"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/TSE-AHEAD.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
<li id="cite_note-fomdd-5"><span class="mw-cite-backlink">^ <a href="#cite_ref-fomdd_5-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-fomdd_5-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-fomdd_5-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-fomdd_5-3"><sup><i><b>d</b></i></sup></a></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122327/ftp://ftp.cs.utexas.edu/pub/predator/ICSE07.pdf">"Feature Oriented Model Driven Development: A Case Study for Portlets"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/ICSE07.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
<li id="cite_note-genmeta-6"><span class="mw-cite-backlink">^ <a href="#cite_ref-genmeta_6-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-genmeta_6-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-genmeta_6-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFTrujilloAzanzaDíaz2007" class="citation book cs1">Trujillo, Salvador; Azanza, Maider; Díaz, Óscar (October 2007). <a rel="nofollow" class="external text" href="http://portal.acm.org/citation.cfm?id=1289971.1289990">"Generative metaprogramming"</a>. <i>Proceedings of the 6th international conference on Generative programming and component engineering</i>. pp.&nbsp;<span class="nowrap">105–</span>114. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F1289971.1289990">10.1145/1289971.1289990</a>. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>9781595938558</bdi>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&nbsp;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:236715">236715</a>.</cite></span>
</li>
<li id="cite_note-splc-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-splc_7-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706123201/ftp://ftp.cs.utexas.edu/pub/predator/splc05.pdf">"Feature Models, Grammars, and Propositional Formulas"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/splc05.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
<li id="cite_note-amast08-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-amast08_8-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.infosun.fim.uni-passau.de/cl/publications/docs/AMAST2008.pdf">"An Algebra for Features and Feature Composition"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-symmetric-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-symmetric_9-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.infosun.fim.uni-passau.de/cl/publications/docs/SC2008.pdf">"Superimposition: A Language-Independent Approach to Software Composition"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-CIDE-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-CIDE_10-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122709/ftp://ftp.cs.utexas.edu/pub/predator/Tools2009.pdf">"Guaranteeing Syntactic Correctness for all Product Line Variants: A Language-Independent Approach"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/Tools2009.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
<li id="cite_note-FH-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-FH_11-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.infosun.fim.uni-passau.de/cl/publications/docs/ICSE2009fh.pdf">"FeatureHouse: Language-Independent, Automated Software Composition"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-testing-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-testing_12-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122351/ftp://ftp.cs.utexas.edu/pub/predator/ISSRE08.pdf">"Testing Software Product Lines Using Incremental Test Generation"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/ISSRE08.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
</ol></div>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}


/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Programming_paradigms_(Comparison_by_language)368" style="padding:3px"><table class="nowraplinks mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div id="Programming_paradigms_(Comparison_by_language)368" style="font-size:114%;margin:0 4em"><a href="Programming_paradigm" title="Programming paradigm">Programming paradigms</a> (<a href="Comparison_of_multi-paradigm_programming_languages" title="Comparison of multi-paradigm programming languages">Comparison by language</a>)</div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Imperative_programming" title="Imperative programming">Imperative</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Structured_programming" title="Structured programming">Structured</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Jackson_structured_programming" title="Jackson structured programming">Jackson structures</a></li>
<li><a href="Block_(programming)" title="Block (programming)">Block-structured</a></li>
<li><a href="Modular_programming" title="Modular programming">Modular</a></li>
<li><a href="Non-structured_programming" title="Non-structured programming">Non-structured</a></li>
<li><a href="Procedural_programming" title="Procedural programming">Procedural</a></li>
<li><a href="Programming_in_the_large_and_programming_in_the_small" title="Programming in the large and programming in the small">Programming in the large and in the small</a></li>
<li><a href="Design_by_contract" title="Design by contract">Design by contract</a></li>
<li><a href="Invariant-based_programming" title="Invariant-based programming">Invariant-based</a></li>
<li><a href="Nested_function" title="Nested function">Nested function</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Object-oriented_programming" title="Object-oriented programming">Object-oriented</a><br>(<a href="Comparison_of_programming_languages_(object-oriented_programming)" title="Comparison of programming languages (object-oriented programming)">comparison</a>, <a href="List_of_object-oriented_programming_languages" title="List of object-oriented programming languages">list</a>)</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Class-based_programming" title="Class-based programming">Class-based</a>, <a href="Prototype-based_programming" title="Prototype-based programming">Prototype-based</a>, <a href="Object-based_language" title="Object-based language">Object-based</a></li>
<li><a href="Agent-oriented_programming" title="Agent-oriented programming">Agent</a></li>
<li><a href="Immutable_object" title="Immutable object">Immutable object</a></li>
<li><a href="Persistent_programming_language" title="Persistent programming language">Persistent</a></li>
<li><a href="Uniform_function_call_syntax" title="Uniform function call syntax">Uniform function call syntax</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Declarative_programming" title="Declarative programming">Declarative</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Functional_programming" title="Functional programming">Functional</a><br>(<a href="Comparison_of_functional_programming_languages" title="Comparison of functional programming languages">comparison</a>)</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Recursion_(computer_science)" title="Recursion (computer science)">Recursive</a></li>
<li><a href="Anonymous_function" title="Anonymous function">Anonymous function</a> (<a href="Partial_application" title="Partial application">Partial application</a>)</li>
<li><a href="Higher-order_programming" title="Higher-order programming">Higher-order</a></li>
<li><a href="Purely_functional_programming" title="Purely functional programming">Purely functional</a></li>
<li><a href="Total_functional_programming" title="Total functional programming">Total</a></li>
<li><a href="Strict_programming_language" title="Strict programming language">Strict</a></li>
<li><a href="Generalized_algebraic_data_type" title="Generalized algebraic data type">GADTs</a></li>
<li><a href="Dependent_type" title="Dependent type">Dependent types</a></li>
<li><a href="Functional_logic_programming" title="Functional logic programming">Functional logic</a></li>
<li><a href="Tacit_programming" title="Tacit programming">Point-free style</a></li>
<li><a href="Expression-oriented_programming_language" title="Expression-oriented programming language">Expression-oriented</a></li>
<li><a href="Applicative_programming_language" title="Applicative programming language">Applicative</a>, <a href="Concatenative_programming_language" title="Concatenative programming language">Concatenative</a></li>
<li><a href="Function-level_programming" title="Function-level programming">Function-level</a>, <a href="Value-level_programming" title="Value-level programming">Value-level</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Dataflow_programming" title="Dataflow programming">Dataflow</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Flow-based_programming" title="Flow-based programming">Flow-based</a></li>
<li><a href="Reactive_programming" title="Reactive programming">Reactive</a> (<a href="Functional_reactive_programming" title="Functional reactive programming">Functional reactive</a>)</li>
<li><a href="Signal_programming" class="mw-redirect" title="Signal programming">Signals</a></li>
<li><a href="Stream_processing" title="Stream processing">Streams</a></li>
<li><a href="Synchronous_programming_language" title="Synchronous programming language">Synchronous</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Logic_programming" title="Logic programming">Logic</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Abductive_logic_programming" title="Abductive logic programming">Abductive logic</a></li>
<li><a href="Answer_set_programming" title="Answer set programming">Answer set</a></li>
<li><a href="Constraint_programming" title="Constraint programming">Constraint</a> (<a href="Constraint_logic_programming" title="Constraint logic programming">Constraint logic</a>)</li>
<li><a href="Inductive_logic_programming" title="Inductive logic programming">Inductive logic</a></li>
<li><a href="Nondeterministic_programming" title="Nondeterministic programming">Nondeterministic</a></li>
<li><a href="Ontology_language" title="Ontology language">Ontology</a></li>
<li><a href="Probabilistic_logic_programming" title="Probabilistic logic programming">Probabilistic logic</a></li>
<li><a href="Query_language" title="Query language">Query</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Domain-specific_language" title="Domain-specific language">DSL</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Algebraic_modeling_language" title="Algebraic modeling language">Algebraic modeling</a></li>
<li><a href="Array_programming" title="Array programming">Array</a></li>
<li><a href="Automata-based_programming" title="Automata-based programming">Automata-based</a> (<a href="Action_language" title="Action language">Action</a>)</li>
<li><a href="Command_language" title="Command language">Command</a> (<a href="Spacecraft_command_language" title="Spacecraft command language">Spacecraft</a>)</li>
<li><a href="Differentiable_programming" title="Differentiable programming">Differentiable</a></li>
<li><a href="End-user_development" title="End-user development">End-user</a></li>
<li><a href="Grammar-oriented_programming" title="Grammar-oriented programming">Grammar-oriented</a></li>
<li><a href="Interface_description_language" title="Interface description language">Interface description</a></li>
<li><a href="Language-oriented_programming" title="Language-oriented programming">Language-oriented</a></li>
<li><a href="List_comprehension" title="List comprehension">List comprehension</a></li>
<li><a href="Low-code_development_platform" title="Low-code development platform">Low-code</a></li>
<li><a href="Modeling_language" title="Modeling language">Modeling</a></li>
<li><a href="Natural-language_programming" class="mw-redirect" title="Natural-language programming">Natural language</a></li>
<li><a href="Non-English-based_programming_languages" title="Non-English-based programming languages">Non-English-based</a></li>
<li><a href="Page_description_language" title="Page description language">Page description</a></li>
<li><a href="Pipeline_(software)" title="Pipeline (software)">Pipes</a> and <a href="Filter_(software)" title="Filter (software)">filters</a></li>
<li><a href="Probabilistic_programming" title="Probabilistic programming">Probabilistic</a></li>
<li><a href="Quantum_programming" title="Quantum programming">Quantum</a></li>
<li><a href="Scientific_programming_language" title="Scientific programming language">Scientific</a></li>
<li><a href="Scripting_language" title="Scripting language">Scripting</a></li>
<li><a href="Set_theoretic_programming" title="Set theoretic programming">Set-theoretic</a></li>
<li><a href="Simulation_language" title="Simulation language">Simulation</a></li>
<li><a href="Stack-oriented_programming" title="Stack-oriented programming">Stack-based</a></li>
<li><a href="System_programming_language" title="System programming language">System</a></li>
<li><a href="Tactile_programming_language" title="Tactile programming language">Tactile</a></li>
<li><a href="Template_processor" title="Template processor">Templating</a></li>
<li><a href="Transformation_language" title="Transformation language">Transformation</a> (<a href="Graph_rewriting" title="Graph rewriting">Graph rewriting</a>, <a href="Production_system_(computer_science)" title="Production system (computer science)">Production</a>, <a href="Pattern_matching" title="Pattern matching">Pattern</a>)</li>
<li><a href="Visual_programming_language" title="Visual programming language">Visual</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Concurrent_computing" title="Concurrent computing">Concurrent</a>,<br><a href="Distributed_computing" title="Distributed computing">distributed</a>,<br><a href="Parallel_computing" title="Parallel computing">parallel</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Actor_model" title="Actor model">Actor-based</a></li>
<li><a href="Automatic_mutual_exclusion" title="Automatic mutual exclusion">Automatic mutual exclusion</a></li>
<li><a href="Choreographic_programming" title="Choreographic programming">Choreographic programming</a></li>
<li><a href="Concurrent_logic_programming" title="Concurrent logic programming">Concurrent logic</a> (<a href="Concurrent_constraint_logic_programming" title="Concurrent constraint logic programming">Concurrent constraint logic</a>)</li>
<li><a href="Concurrent_object-oriented_programming" title="Concurrent object-oriented programming">Concurrent OO</a></li>
<li><a href="Macroprogramming" title="Macroprogramming">Macroprogramming</a></li>
<li><a href="Multitier_programming" title="Multitier programming">Multitier programming</a></li>
<li><a href="Organic_computing" title="Organic computing">Organic computing</a></li>
<li><a href="Parallel_programming_model" title="Parallel programming model">Parallel programming models</a></li>
<li><a href="Partitioned_global_address_space" title="Partitioned global address space">Partitioned global address space</a></li>
<li><a href="Process-oriented_programming" title="Process-oriented programming">Process-oriented</a></li>
<li><a href="Relativistic_programming" title="Relativistic programming">Relativistic programming</a></li>
<li><a href="Service-oriented_programming" title="Service-oriented programming">Service-oriented</a></li>
<li><a href="Structured_concurrency" title="Structured concurrency">Structured concurrency</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Metaprogramming" title="Metaprogramming">Metaprogramming</a></th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Attribute-oriented_programming" title="Attribute-oriented programming">Attribute-oriented</a></li>
<li><a href="Automatic_programming" title="Automatic programming">Automatic</a> (<a href="Inductive_programming" title="Inductive programming">Inductive</a>)</li>
<li><a href="Dynamic_programming_language" title="Dynamic programming language">Dynamic</a></li>
<li><a href="Extensible_programming" title="Extensible programming">Extensible</a></li>
<li><a href="Generic_programming" title="Generic programming">Generic</a></li>
<li><a href="Homoiconicity" title="Homoiconicity">Homoiconicity</a></li>
<li><a href="Interactive_programming" title="Interactive programming">Interactive</a></li>
<li><a href="Macro_(computer_science)" title="Macro (computer science)">Macro</a> (<a href="Hygienic_macro" title="Hygienic macro">Hygienic</a>)</li>
<li><a href="Metalinguistic_abstraction" title="Metalinguistic abstraction">Metalinguistic abstraction</a></li>
<li><a href="Multi-stage_programming" title="Multi-stage programming">Multi-stage</a></li>
<li><a href="Program_synthesis" title="Program synthesis">Program synthesis</a> (<a href="Bayesian_program_synthesis" title="Bayesian program synthesis">Bayesian</a>, <a href="Inferential_programming" title="Inferential programming">Inferential</a>, <a href="Programming_by_demonstration" title="Programming by demonstration">by demonstration</a>, <a href="Programming_by_example" title="Programming by example">by example</a>)</li>
<li><a href="Reflective_programming" title="Reflective programming">Reflective</a></li>
<li><a href="Self-modifying_code" title="Self-modifying code">Self-modifying code</a></li>
<li><a href="Symbolic_programming" title="Symbolic programming">Symbolic</a></li>
<li><a href="Template_metaprogramming" title="Template metaprogramming">Template</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Separation_of_concerns" title="Separation of concerns">Separation<br>of concerns</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Aspect-oriented_programming" title="Aspect-oriented programming">Aspects</a></li>
<li><a href="Component-based_software_engineering" title="Component-based software engineering">Components</a></li>
<li><a href="Data-driven_programming" title="Data-driven programming">Data-driven</a></li>
<li><a href="Data-oriented_design" title="Data-oriented design">Data-oriented</a></li>
<li><a href="Event-driven_programming" title="Event-driven programming">Event-driven</a></li>

<li><a href="Literate_programming" title="Literate programming">Literate</a></li>
<li><a href="Role-oriented_programming" title="Role-oriented programming">Roles</a></li>
<li><a href="Subject-oriented_programming" title="Subject-oriented programming">Subjects</a></li></ul>
</div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-05-27" href="https://en.wikipedia.org/wiki/?title=Feature-oriented_programming&amp;oldid=1292508068">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>